Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Prolog (Programmiersprache)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Prolog_(Programmiersprache)"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Prolog_Programmiersprache rootpage-Prolog_Programmiersprache skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Prolog (Programmiersprache)</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><table class="float-right infobox toccolours toptextcells" style="font-size:90%; margin-top:0; width:21em;">

<tbody><tr>
<th colspan="2" class="hintergrundfarbe6" style="font-size:larger;">Prolog
</th></tr>




<tr>
<th colspan="2" class="hintergrundfarbe5" style="font-size:105%; text-align:center;">Basisdaten
</th></tr>
<tr>
<td><b><a href="Programmierparadigma" title="Programmierparadigma">Paradigmen</a>:</b>
</td>
<td><a href="Logische_Programmierung" title="Logische Programmierung">logisch</a>, <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklarativ</a>, oft auch <a href="Constraintprogrammierung" title="Constraintprogrammierung">constraintbasiert</a>
</td></tr>
<tr>
<td><b>Erscheinungsjahr:</b>
</td>
<td>1972
</td></tr>
<tr>
<td><b>Designer:</b>
</td>
<td><a href="Alain_Colmerauer" title="Alain Colmerauer">Alain Colmerauer</a>
</td></tr>
<tr>
<td><b>Entwickler:</b>
</td>
<td>Philippe Roussell
</td></tr>




<tr>
<td><b><a href="Typisierung_(Informatik)" title="Typisierung (Informatik)">Typisierung</a>:</b>
</td>
<td><a href="Schwache_Typisierung" class="mw-redirect" title="Schwache Typisierung">schwach</a>, <a href="Dynamische_Typisierung" title="Dynamische Typisierung">dynamisch</a>
</td></tr>
<tr>
<td><b>Wichtige <a href="Implementierung" title="Implementierung">Implementierungen</a>:</b>
</td>
<td>SICStus, SWI-Prolog, GNU Prolog, XSB, YAP-Prolog
</td></tr>
<tr>
<td><b>Dialekte:</b>
</td>
<td>ISO-Prolog, Edinburgh Prolog, BinProlog, Visual/Turbo Prolog; historisch: micro-Prolog
</td></tr>
<tr>
<td><b>Standardisierungen:</b>
</td>
<td>ISO/IEC 13211-1:1995
</td></tr>
<tr>
<td><b>Beeinflusst von:</b>
</td>
<td>Planner, Q-Systems, <a href="Maschinengest%C3%BCtztes_Beweisen" title="Maschinengestütztes Beweisen">Theorembeweiser</a>, <a href="Horn-Formel" title="Horn-Formel">Horn-Klauseln</a>
</td></tr>
<tr>
<td><b>Beeinflusste:</b>
</td>
<td><a href="Erlang_(Programmiersprache)" title="Erlang (Programmiersprache)">Erlang</a>, <a href="Mercury_(Programmiersprache)" title="Mercury (Programmiersprache)">Mercury</a>, <a href="Oz_(Programmiersprache)" title="Oz (Programmiersprache)">Mozart/Oz</a>, Picat
</td></tr>





</tbody></table>
<p><b>Prolog</b> (vom <a href="Franz%C3%B6sische_Sprache" title="Französische Sprache">Französischen</a>: <i><b>pro</b>grammation en <b>log</b>ique</i>,<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> deutsch: „Programmieren in Logik“) ist eine <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a>, die Anfang der 1970er Jahre maßgeblich von dem französischen <a href="Informatik" title="Informatik">Informatiker</a> <a href="Alain_Colmerauer" title="Alain Colmerauer">Alain Colmerauer</a> entwickelt wurde und ein <a href="Deklarative_Programmierung" title="Deklarative Programmierung">deklaratives Programmieren</a> ermöglicht. Sie gilt als die wichtigste <a href="Logische_Programmierung" title="Logische Programmierung">logische Programmiersprache</a>.
</p><p>Erste Implementierungen wichen in ihrer <a href="Syntax" title="Syntax">Syntax</a> stark voneinander ab, aber der <a href="Edinburgh" title="Edinburgh">Edinburgh</a>-Dialekt setzte sich bald als Quasistandard durch. Er war jedoch nicht formal definiert,<sup id="cite_ref-c+m_2-0" class="reference"><a href="#cite_note-c+m-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> bis er 1995 zur Grundlage eines <a href="Internationale_Organisation_f%C3%BCr_Normung" title="Internationale Organisation für Normung">ISO</a>-Standards wurde (ISO/IEC 13211-1), der auch ISO-Prolog genannt wird.
</p><p>Der erste Prolog-<a href="Interpreter" title="Interpreter">Interpreter</a> wurde in <a href="Marseille" title="Marseille">Marseille</a> in <a href="Algol_W" title="Algol W">ALGOL&nbsp;W</a> realisiert. Der erste Ansatz für einen <a href="Compiler" title="Compiler">Compiler</a> stammte von <a href="David_H._D._Warren" title="David H. D. Warren">David H. D. Warren</a> aus Edinburgh. Dieser hatte als Zielsprache die des Logik-Prozessors <a href="Warren%E2%80%99s_Abstract_Machine" title="Warren’s Abstract Machine">Warren’s Abstract Machine</a> und erlaubte deshalb weder dynamische Änderungen noch einen Anschluss rücksetzbarer Prädikate in anderen Programmiersprachen. Der erste voll nutzbare Compiler, der beides erlaubte, wurde von Preben Folkjaer und Christian Pichler in <a href="M%C3%BCnchen" title="München">München</a> entwickelt. Er verwandte einen anderen, von der <a href="Technische_Universit%C3%A4t_Wien" title="Technische Universität Wien">TU Wien</a> stammenden Zwischencode, der inkrementell kompiliert wurde; wurden Prädikate verändert, wurde das Kompilat gelöscht und beim nächsten Aufruf neu kompiliert.
</p>

<div class="mw-heading mw-heading2"><h2 id="Grundprinzip">Grundprinzip</h2></div>
<p>Prolog-Programme bestehen aus einer <a href="Wissensdatenbank" title="Wissensdatenbank">Wissensdatenbank</a>, deren Einträge sich Fakten und Regeln nennen. Der Benutzer formuliert Anfragen an diese Wissensdatenbank.
Der Prolog-Interpreter benutzt die Fakten und Regeln, um systematisch eine Antwort zu finden.
Ein positives Resultat bedeutet, dass die Anfrage logisch ableitbar ist. Ein negatives Resultat bedeutet nur, dass aufgrund der Datenbasis keine Ableitung gefunden werden kann.
Dies hängt eng mit der <a href="Closed_world_assumption" title="Closed world assumption">Closed world assumption</a> zusammen (siehe unten).
</p><p>Das typische erste Programm in Prolog ist nicht wie in prozeduralen Programmiersprachen ein <a href="Hallo-Welt-Programm" title="Hallo-Welt-Programm">Hallo-Welt</a>-Beispiel, sondern eine Wissensdatenbank mit Stammbauminformationen.
</p><p>Folgendes Beispiel repräsentiert den <a href="Stammbaum" title="Stammbaum">Stammbaum</a> einer kleinen Familie.
Das erste Faktum in Form einer Aussage <code>mann(tobias).</code> liest sich als: Tobias ist ein Mann. <code>vater(tobias, frank).</code> definiert das Faktum: Tobias ist der Vater von Frank. Für Hinweise zum Laden von Prolog-Texten siehe entsprechenden Abschnitt:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% Prolog-Text mit Fakten</span>
<span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">adam</span><span class="p">).</span>
<span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">tobias</span><span class="p">).</span>
<span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">frank</span><span class="p">).</span>
<span class="nf">frau</span><span class="p">(</span><span class="s s-Atom">eva</span><span class="p">).</span>
<span class="nf">frau</span><span class="p">(</span><span class="s s-Atom">daniela</span><span class="p">).</span>
<span class="nf">frau</span><span class="p">(</span><span class="s s-Atom">ulrike</span><span class="p">).</span>
<span class="nf">vater</span><span class="p">(</span><span class="s s-Atom">adam</span><span class="p">,</span> <span class="s s-Atom">tobias</span><span class="p">).</span>
<span class="nf">vater</span><span class="p">(</span><span class="s s-Atom">tobias</span><span class="p">,</span> <span class="s s-Atom">frank</span><span class="p">).</span>
<span class="nf">vater</span><span class="p">(</span><span class="s s-Atom">tobias</span><span class="p">,</span> <span class="s s-Atom">ulrike</span><span class="p">).</span>
<span class="nf">mutter</span><span class="p">(</span><span class="s s-Atom">eva</span><span class="p">,</span> <span class="s s-Atom">tobias</span><span class="p">).</span>
<span class="nf">mutter</span><span class="p">(</span><span class="s s-Atom">daniela</span><span class="p">,</span> <span class="s s-Atom">frank</span><span class="p">).</span>
<span class="nf">mutter</span><span class="p">(</span><span class="s s-Atom">daniela</span><span class="p">,</span> <span class="s s-Atom">ulrike</span><span class="p">).</span>
</pre></div>
<p>In einem Prolog-Interpreter können nun interaktiv Anfragen an die Datenbasis gestellt werden. Das Ausführen eines Prolog-Programms bedeutet immer das Stellen einer Anfrage.
Das System antwortet entweder mit <code>yes.</code>/<code>true.</code> oder <code>no.</code>/<code>false.</code>, abhängig davon, ob die Anfrage bewiesen werden konnte.
Der Interpreter signalisiert mit der <a href="Eingabeaufforderung" class="mw-redirect" title="Eingabeaufforderung">Eingabeaufforderung</a> <code>?-</code>, dass er eine Anfrage erwartet:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">tobias</span><span class="p">).</span>
<span class="s s-Atom">yes</span><span class="p">.</span>
<span class="s s-Atom">?-</span> <span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">heinrich</span><span class="p">).</span>
<span class="s s-Atom">no</span><span class="p">.</span>
</pre></div>
<p>Eine Anfrage mit einer Variablen liefert als Antwort zusätzlich Belegungen, mit denen die Anfrage wahr wird. Man nennt eine solche Variablenbelegung <a href="Unifikation_(Logik)" title="Unifikation (Logik)">Unifikation</a> und sagt, die Variable wird mit diesem Wert unifiziert. Variablen sind in Prolog <a href="Token_(%C3%9Cbersetzerbau)" title="Token (Übersetzerbau)">Token</a>, die mit einem Großbuchstaben beginnen:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">frau</span><span class="p">(</span><span class="nv">X</span><span class="p">).</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">eva</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">daniela</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">ulrike</span>
</pre></div>
<p><i>no</i> ist die Antwort auf die um die vorher ausgegebenen Antworten reduzierte Faktenliste.
</p><p>Der Interpreter liefert nur positive Antworten auf Anfragen, die explizit definiert oder folgerbar sind (Closed world assumption). So liegen etwa über <i>heinrich</i> keinerlei Informationen in der Datenbasis:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">mann</span><span class="p">(</span><span class="s s-Atom">heinrich</span><span class="p">).</span>
<span class="s s-Atom">no</span><span class="p">.</span>
<span class="s s-Atom">?-</span> <span class="nf">frau</span><span class="p">(</span><span class="s s-Atom">heinrich</span><span class="p">).</span>
<span class="s s-Atom">no</span><span class="p">.</span>
</pre></div>
<p>Zusätzlich zu Fakten lassen sich in Prolog Regeln formulieren.
Der Regeloperator <code>:-</code> ist dabei wie ein umgedrehter <a href="Implikation" title="Implikation">Implikationspfeil</a> zu lesen. Beispiel:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% Prolog Text mit Regel</span>
<span class="nf">grossvater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">),</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">Z</span><span class="p">,</span> <span class="nv">Y</span><span class="p">).</span>
</pre></div>
<p>Die Regel besagt: X ist Großvater von Y, wenn es ein Z gibt, sodass X Vater von Z ist und Z Vater von Y. Damit ist der Großvater väterlicherseits definiert.
Eine zweite Regel für den Großvater mütterlicherseits sieht so aus:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">grossvater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">),</span>
<span class="nf">mutter</span><span class="p">(</span><span class="nv">Z</span><span class="p">,</span> <span class="nv">Y</span><span class="p">).</span>
</pre></div>
<p>Der Operator <code>,</code> in dieser Regel definiert eine <a href="Konjunktion_(Logik)" title="Konjunktion (Logik)">Konjunktion</a> und wird <i>und</i> gesprochen.
Der Term links vom Implikationsoperator nennt sich auch Head oder Konsequenz.
Haben zwei Regeln (wie oben) die gleiche Konsequenz, folgt
diese, wenn mindestens in einer Regel die Vorbedingung erfüllt ist (<a href="Disjunktion" title="Disjunktion">Disjunktion</a>).
</p><p>Durch die Definition von Regeln kann auch auf Fakten geschlossen werden, die nicht explizit in der Datenbasis stehen:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">grossvater</span><span class="p">(</span><span class="s s-Atom">adam</span><span class="p">,</span> <span class="s s-Atom">ulrike</span><span class="p">).</span>
<span class="s s-Atom">yes</span><span class="p">.</span>
<span class="s s-Atom">?-</span> <span class="nf">grossvater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="s s-Atom">frank</span><span class="p">).</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">adam</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Syntax">Syntax</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Boolesche_Algebra">Boolesche Algebra</h3></div>
<p>Das <a href="Konjunktion_(Logik)" title="Konjunktion (Logik)">logische Und</a> wird durch ein <a href="Komma" title="Komma">Komma</a> dargestellt:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="s s-Atom">true</span><span class="p">,</span><span class="s s-Atom">true</span><span class="p">.</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">true</span><span class="p">,</span><span class="s s-Atom">false</span><span class="p">.</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">false</span><span class="p">,</span><span class="s s-Atom">true</span><span class="p">.</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">false</span><span class="p">,</span><span class="s s-Atom">false</span><span class="p">.</span>
<span class="s s-Atom">false</span><span class="p">.</span>
</pre></div>
<p>Das <a href="Disjunktion" title="Disjunktion">logische Oder</a> wird durch ein <a href="Semikolon" title="Semikolon">Semikolon</a> dargestellt:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="s s-Atom">true</span><span class="p">;</span><span class="s s-Atom">true</span><span class="p">.</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">true</span><span class="p">;</span><span class="s s-Atom">false</span><span class="p">.</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">false</span><span class="p">;</span><span class="s s-Atom">true</span><span class="p">.</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">false</span><span class="p">;</span><span class="s s-Atom">false</span><span class="p">.</span>
<span class="s s-Atom">false</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Vergleiche">Vergleiche</h3></div>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">&lt;</span> <span class="mf">4.</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">&gt;</span> <span class="mf">4.</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="s s-Atom">anton</span> <span class="o">==</span> <span class="s s-Atom">anton</span><span class="p">.</span> <span class="c1">% == prüft ob das muster links und rechts übereinstimmt</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">==</span> <span class="mi">1</span><span class="o">+</span><span class="mf">2.</span> <span class="c1">% muster stimmt nicht überein</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="s s-Atom">\==</span> <span class="mi">1</span><span class="o">+</span><span class="mf">2.</span> <span class="c1">% \== prüft ob das muster links und rechts nicht übereinstimmt</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">=:=</span> <span class="mi">1</span><span class="o">+</span><span class="mf">2.</span> <span class="c1">% =:= ist der numerische vergleich</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="s s-Atom">=\=</span> <span class="mf">4.</span> <span class="c1">% =\= die numerische Ungleichheit</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="s s-Atom">=\=</span> <span class="mi">1</span><span class="o">+</span><span class="mf">2.</span> <span class="c1">% 3=3</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">=&lt;</span> <span class="mf">4.</span> <span class="c1">% =&lt; bedeutet kleiner/gleich; '&lt;=' ist nicht zulässig</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">3</span> <span class="o">&gt;=</span> <span class="mf">4.</span> <span class="c1">% &gt;= bedeutet größer/gleich</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="mi">4</span> <span class="s s-Atom">\=</span> <span class="mf">2.</span> <span class="c1">% \= prüft ob unifikation unmöglich ist</span>
<span class="s s-Atom">true</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="nv">X</span> <span class="o">+</span> <span class="mi">4</span> <span class="s s-Atom">\=</span> <span class="mi">2</span> <span class="o">+</span> <span class="nv">Y</span><span class="p">.</span> <span class="c1">% Durch X=2 und Y=4 (unifikation) werden die muster identisch</span>
<span class="s s-Atom">false</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Regeln">Regeln</h3></div>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% Wenn X Vater von Z ist und Z Vater von Y ist, dann ist X Großvater von Y</span>
<span class="nf">grossvater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">),</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">Z</span><span class="p">,</span> <span class="nv">Y</span><span class="p">).</span>

<span class="c1">% Adam ist der Vater von Tobias</span>
<span class="nf">vater</span><span class="p">(</span><span class="s s-Atom">adam</span><span class="p">,</span> <span class="s s-Atom">tobias</span><span class="p">).</span>

<span class="c1">% Tobias ist der Vater von Frank</span>
<span class="nf">vater</span><span class="p">(</span><span class="s s-Atom">tobias</span><span class="p">,</span> <span class="s s-Atom">frank</span><span class="p">).</span>

<span class="c1">% Abfrage ob Adam der Großvater von Frank ist</span>
<span class="s s-Atom">?-</span> <span class="nf">grossvater</span><span class="p">(</span><span class="s s-Atom">adam</span><span class="p">,</span> <span class="s s-Atom">frank</span><span class="p">).</span>
<span class="s s-Atom">true</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Symmetrische_Relation">Symmetrische Relation</h4></div>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% anton und berta sind ein Ehepaar</span>
<span class="nf">ehepaar</span><span class="p">(</span><span class="s s-Atom">anton</span><span class="p">,</span> <span class="s s-Atom">berta</span><span class="p">).</span>

<span class="c1">% das Ehepaar X Und Y ist genau dann ein Ehepaar,</span>
<span class="c1">% wenn ein Ehepaar Y Und X existiert</span>
<span class="nf">ehepaar</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">)</span> <span class="p">:-</span> <span class="nf">ehepaar</span><span class="p">(</span><span class="nv">Y</span><span class="p">,</span> <span class="nv">X</span><span class="p">).</span>

<span class="c1">% Abfrage ob Berta und Anton ein Ehepaar sind</span>
<span class="s s-Atom">?-</span> <span class="nf">ehepaar</span><span class="p">(</span><span class="s s-Atom">berta</span><span class="p">,</span> <span class="s s-Atom">anton</span><span class="p">).</span>
<span class="s s-Atom">true</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Arithmetik">Arithmetik</h3></div>
<p>Prolog kennt die Grundrechenarten, also <a href="Addition" title="Addition">Addition</a> <code>+</code>, <a href="Subtraktion" title="Subtraktion">Subtraktion</a> <code>-</code>, <a href="Multiplikation" title="Multiplikation">Multiplikation</a> <code>*</code>, <a href="Division_(Mathematik)" title="Division (Mathematik)">Division</a> <code>/</code> und <a href="Modulo" class="mw-redirect" title="Modulo">Modulo</a> <code>mod</code>. Die Zuweisung eines Wertes zu einer Variable erfolgt mit dem Schlüsselwort <code>is</code>. Im Gegensatz zu <a href="Imperative_Programmierung" title="Imperative Programmierung">imperativen Programmiersprachen</a> können in Prolog Variablenwerte nicht überschrieben werden.
</p>
<div class="mw-heading mw-heading3"><h3 id="Listen">Listen</h3></div>
<p>Listen sind rekursive Datenstrukturen bestehend aus einem Kopf (<i><span lang="en">Head</span></i>) und einem Rest (<i><span lang="en">Tail</span></i>). Der Rest kann hierbei wieder aus Listen bestehen.
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% Head ist die Zahl 1</span>
<span class="c1">% Tail ist die Liste [2]</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span>

<span class="c1">% Head ist die Zeichenkette 'one'</span>
<span class="c1">% Tail ist die Liste ['two']</span>
<span class="p">[</span><span class="s s-Atom">'one'</span><span class="p">,</span> <span class="s s-Atom">'two'</span><span class="p">]</span>

<span class="c1">% Listen können auch gemischt sein</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="s s-Atom">'two'</span><span class="p">]</span>

<span class="c1">% Head ist die Ziffer 1</span>
<span class="c1">% Tail ist die Liste [2,3]</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</pre></div>
<p>Um zu prüfen ob ein bestimmtes Element in einer Liste enthalten ist, wird die vordefinierte Funktion <code>member</code> verwendet:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">member</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="p">[</span><span class="nv">X</span><span class="p">|</span><span class="k">_</span><span class="p">]).</span>
<span class="nf">member</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="p">[</span><span class="k">_</span><span class="p">|</span><span class="nv">T</span><span class="p">])</span> <span class="p">:-</span>
<span class="nf">member</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">T</span><span class="p">).</span>

<span class="s s-Atom">?-</span> <span class="nf">member</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="p">[</span><span class="s s-Atom">'anton'</span><span class="p">,</span><span class="s s-Atom">'berta'</span><span class="p">,</span><span class="s s-Atom">'caesar'</span><span class="p">]).</span>
<span class="s s-Atom">false</span><span class="p">.</span>

<span class="s s-Atom">?-</span> <span class="nf">member</span><span class="p">(</span><span class="s s-Atom">'berta'</span><span class="p">,</span> <span class="p">[</span><span class="s s-Atom">'anton'</span><span class="p">,</span><span class="s s-Atom">'berta'</span><span class="p">,</span><span class="s s-Atom">'caesar'</span><span class="p">]).</span>
<span class="s s-Atom">true</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Laden_von_Prolog-Texten">Laden von Prolog-Texten</h3></div>
<p>Ein Prolog-Text kann direkt über die Konsole eingegeben werden. Dazu kann man auf
der Eingabezeile <code>[user]</code> tippen. Die Eingabe der Klauseln muss mit einem Dateienendezeichen abgeschlossen werden (^D oder ^Z je nach Plattform):
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="p">[</span><span class="s s-Atom">user</span><span class="p">].</span> <span class="c1">% tippe Prolog-Text direkt ein</span>
<span class="nf">append</span><span class="p">([],</span> <span class="nv">X</span><span class="p">,</span> <span class="nv">X</span><span class="p">).</span>
<span class="nf">append</span><span class="p">([</span><span class="nv">X</span><span class="p">|</span><span class="nv">Y</span><span class="p">],</span> <span class="nv">Z</span><span class="p">,</span> <span class="p">[</span><span class="nv">X</span><span class="p">|</span><span class="nv">T</span><span class="p">])</span> <span class="p">:-</span> <span class="nf">append</span><span class="p">(</span><span class="nv">Y</span><span class="p">,</span> <span class="nv">Z</span><span class="p">,</span> <span class="nv">T</span><span class="p">).</span>
<span class="s s-Atom">^</span><span class="nv">D</span>
</pre></div>
<p>Alternativ kann ein Prolog-Text in einer Datei gespeichert werden und z.&nbsp;B. mit dem Prädikat <code>consult</code> geladen werden. Das Prädikat nimmt einen physischen Pfad zu einem Prolog-Text entgegen:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">consult</span><span class="p">(</span><span class="s s-Atom">'append.pl'</span><span class="p">).</span> <span class="c1">% lade Prolog Text-aus Datei</span>
<span class="s s-Atom">true</span><span class="p">.</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Weitere_Techniken">Weitere Techniken</h2></div>
<p>Entscheidend für die Prolog-Programmierung sind die Techniken der <a href="Rekursion" title="Rekursion">Rekursion</a> und die Nutzung von <a href="Liste_(Datenstruktur)" title="Liste (Datenstruktur)">Listen</a>.
</p><p>Ist die Rekursion in den meisten Programmiersprachen nur eine zusätzliche Variante zur <a href="Iteration" title="Iteration">Iteration</a>, ist sie bei der Prolog-Programmierung die einzige Möglichkeit, <i>Schleifen</i> zu produzieren. Benötigt man in obigem Beispiel eine allgemeine <i>Vorfahr</i>-Relation, wird das wie folgt realisiert („;“ zeigt in der Klausel die Disjunktion bzw. das logische „oder“):
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="c1">% X ist genau dann ein elternteil von Y,</span>
<span class="c1">% wenn X die mutter von Y ist Oder</span>
<span class="c1">% wenn X der vater von Y ist.</span>
<span class="nf">elternteil</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">mutter</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">);</span>
<span class="nf">vater</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">).</span>

<span class="c1">% X ist einerseits dann ein vorfahr von Z,</span>
<span class="c1">% wenn X ein elternteil von Z ist.</span>
<span class="nf">vorfahr</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">)</span> <span class="p">:-</span> <span class="nf">elternteil</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">).</span>

<span class="c1">% X ist andererseits dann ein vorfahr von Z, wenn</span>
<span class="c1">% X ein elternteil von Y ist Und</span>
<span class="c1">% Y ein vorfahre von Z ist</span>
<span class="nf">vorfahr</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Z</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">elternteil</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="nv">Y</span><span class="p">),</span>
<span class="nf">vorfahr</span><span class="p">(</span><span class="nv">Y</span><span class="p">,</span> <span class="nv">Z</span><span class="p">).</span>
</pre></div>
<p>Dies lässt sich wie folgt lesen: X ist ein Vorfahr von Z, wenn X Elternteil von Z ist (Regel 1) oder es ein Y gibt, das Vorfahr von Z ist und gleichzeitig X Elternteil von Y (Regel 2) (Es wurde hier <i>elternteil</i> statt <i>mutter</i> oder <i>vater</i> verwendet.)
</p><p>Auch <a href="Liste_(Datenstruktur)" title="Liste (Datenstruktur)">Listen</a> sind ein entscheidender Bestandteil von Prolog. Die meisten Prolog-Implementationen bringen dafür viele Basisfunktionen mit („concat“ = Anhängen von Werten, „count“ = Anzahl der Werte etc.), die sich aber auch alle selbst definieren lassen. In einer gedachten Familienstruktur muss die Anzahl der Kinder ja variabel sein. Folgendes wäre denkbar:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">familie</span><span class="p">(</span><span class="s s-Atom">heinz</span><span class="p">,</span> <span class="s s-Atom">jutta</span><span class="p">,</span> <span class="p">[</span><span class="s s-Atom">peter</span><span class="p">,</span><span class="s s-Atom">laura</span><span class="p">]).</span>
<span class="nf">familie</span><span class="p">(</span><span class="s s-Atom">karl</span><span class="p">,</span> <span class="s s-Atom">gertrud</span><span class="p">,</span> <span class="p">[]).</span>
</pre></div>
<p>Dann ließen sich z.&nbsp;B. mit einer Abfrage alle Männer ohne Kinder anzeigen:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">familie</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span> <span class="k">_</span><span class="p">,</span> <span class="p">[]).</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">karl</span>
</pre></div>
<p>Dabei ist X die Variable, deren verschiedene Werte ausgegeben werden sollen. Der Unterstrich _ ist in Prolog die anonyme Variable, wodurch Prolog veranlasst wird hier jeden Wert zuzulassen. Die eckigen Klammern stehen für die leere Liste, welche die nicht vorhandenen Kinder repräsentiert.
</p><p>Eine weitere Eigenschaft und Besonderheit gegenüber anderen Programmiersprachen ist, dass Prolog in der Lage ist, während der Laufzeit seine vorhandene Datenbank zu erweitern oder zu löschen. Ein Beispiel für das Löschen eines einzelnen Elements:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="s s-Atom">rot</span><span class="p">).</span>
<span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="s s-Atom">blau</span><span class="p">).</span>

<span class="nf">autofarbe</span><span class="p">(</span><span class="nv">Automarke</span><span class="p">,</span> <span class="nv">X</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">retract</span><span class="p">(</span><span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="k">_</span><span class="p">)),</span>
<span class="nf">auto</span><span class="p">(</span><span class="nv">Automarke</span><span class="p">,</span> <span class="nv">X</span><span class="p">).</span>
</pre></div>
<p>Die Abfrage:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="nv">X</span><span class="p">).</span>
</pre></div>
<p>ergibt (anfänglich) ganz normal:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">X</span><span class="o">=</span><span class="s s-Atom">rot</span><span class="p">;</span>
<span class="nv">X</span><span class="o">=</span><span class="s s-Atom">blau</span><span class="p">;</span>
<span class="nv">No</span>
</pre></div>
<p>Die Abfrage:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span> <span class="nf">autofarbe</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="nv">X</span><span class="p">).</span>
</pre></div>
<p>würde beim ersten Mal:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">X</span><span class="o">=</span><span class="s s-Atom">blau</span><span class="p">;</span>
<span class="nv">No</span>
</pre></div>
<p>beim zweiten Mal nur noch:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">No</span>
</pre></div>
<p>liefern, da die Informationen:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="s s-Atom">rot</span><span class="p">).</span>
<span class="nf">auto</span><span class="p">(</span><span class="s s-Atom">bmw</span><span class="p">,</span> <span class="s s-Atom">blau</span><span class="p">).</span>
</pre></div>
<p>aus der Datenbank gelöscht wurden. Auch <i>?- auto(bmw,X)</i> liefert jetzt nur noch <i>No</i>.
Zum Löschen aller gleichen Elemente (also z.&nbsp;B. <i>auto()</i>) auf einmal benutzt man retractall(), zum Ausgeben asserta() (oben in der Datenbank) und assertz() (unten in der Datenbank).
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiele">Beispiele</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Lösen_eines_mathematischen_Rätsels"><span id="L.C3.B6sen_eines_mathematischen_R.C3.A4tsels"></span>Lösen eines mathematischen Rätsels</h3></div>
<pre>ABB - CD = EED
- - *
FD + EF = CE
= = =
EGD * FH =&nbsp;???
</pre>
<p>A bis H stehen jeweils für eine Ziffer 0 bis 9, wobei nicht klar ist, welche Ziffer welchem Buchstaben entspricht. Gesucht ist die Zahl, die bei den Fragezeichen stehen muss. Dieses Problem ist in Prolog sehr einfach zu lösen. Man schreibt zunächst eine Regel, die bewirkt, dass A bis H später mit allen möglichen Kombinationen von 0 bis 9 belegt werden (<a href="Permutation" title="Permutation">Permutation</a>):
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">gen</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span><span class="nv">B</span><span class="p">,</span><span class="nv">C</span><span class="p">,</span><span class="nv">D</span><span class="p">,</span><span class="nv">E</span><span class="p">,</span><span class="nv">F</span><span class="p">,</span><span class="nv">G</span><span class="p">,</span><span class="nv">H</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">permutation</span><span class="p">([</span><span class="nv">A</span><span class="p">,</span><span class="nv">B</span><span class="p">,</span><span class="nv">C</span><span class="p">,</span><span class="nv">D</span><span class="p">,</span><span class="nv">E</span><span class="p">,</span><span class="nv">F</span><span class="p">,</span><span class="nv">G</span><span class="p">,</span><span class="nv">H</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">7</span><span class="p">,</span><span class="mi">8</span><span class="p">,</span><span class="mi">9</span><span class="p">]).</span>
</pre></div>
<p>Nun müssen nur die fünf entstehenden Gleichungen (<i>ABB – CD = EED</i>, <i>FD + EF = CE</i>, <i>ABB – FD = EGD</i>, <i>CD – EF = FH</i> und <i>EED * CE = EGD * FH = <b>X</b></i>) in Prolog-Syntax geschrieben werden:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">gl1</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">)</span> <span class="p">:-</span>
<span class="p">((</span><span class="nv">A</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">B</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">B</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="nv">C</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">))</span> <span class="o">=:=</span> <span class="p">(</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">E</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">).</span>
<span class="nf">gl2</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">)</span> <span class="p">:-</span>
<span class="p">((</span><span class="nv">F</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">F</span><span class="p">))</span> <span class="o">=:=</span> <span class="p">(</span><span class="nv">C</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">E</span><span class="p">).</span>
<span class="nf">gl3</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">G</span><span class="p">)</span> <span class="p">:-</span>
<span class="p">((</span><span class="nv">A</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">B</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">B</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="nv">F</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">))</span> <span class="o">=:=</span> <span class="p">(</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">G</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">).</span>
<span class="nf">gl4</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">H</span><span class="p">)</span> <span class="p">:-</span>
<span class="p">((</span><span class="nv">C</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">F</span><span class="p">))</span> <span class="o">=:=</span> <span class="p">(</span><span class="nv">F</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">H</span><span class="p">).</span>
<span class="nf">gl5</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">G</span><span class="p">,</span> <span class="nv">H</span><span class="p">,</span> <span class="nv">X</span><span class="p">)</span> <span class="p">:-</span>
<span class="p">((</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">E</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">C</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">E</span><span class="p">))</span> <span class="o">=:=</span>
<span class="p">((</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">G</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">F</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">H</span><span class="p">)),</span> <span class="nv">X</span> <span class="o">is</span> <span class="p">((</span><span class="nv">E</span> <span class="o">*</span> <span class="mi">100</span> <span class="o">+</span> <span class="nv">G</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">D</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="nv">F</span> <span class="o">*</span> <span class="mi">10</span> <span class="o">+</span> <span class="nv">H</span><span class="p">)).</span>
</pre></div>
<p>Interessiert nur <i>X</i>, wird eine Lösungsregel angelegt, die alles zusammenführt und <i>X</i> ausgibt:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">loesung</span> <span class="o">:-</span>
<span class="nf">gen</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">G</span><span class="p">,</span> <span class="nv">H</span><span class="p">),</span>
<span class="nf">gl1</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">),</span>
<span class="nf">gl2</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">),</span>
<span class="nf">gl3</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">G</span><span class="p">),</span>
<span class="nf">gl4</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">H</span><span class="p">),</span>
<span class="nf">gl5</span><span class="p">(</span><span class="nv">C</span><span class="p">,</span> <span class="nv">D</span><span class="p">,</span> <span class="nv">E</span><span class="p">,</span> <span class="nv">F</span><span class="p">,</span> <span class="nv">G</span><span class="p">,</span> <span class="nv">H</span><span class="p">,</span> <span class="nv">X</span><span class="p">),</span>
<span class="nf">write</span><span class="p">(</span><span class="nv">X</span><span class="p">).</span>
</pre></div>
<p>Wird nun die Abfrage <i>loesung.</i> eingegeben, wird die Lösung ausgegeben. Wie man sieht, benötigt man zur Lösung dieses Problems fast keine Programmierkenntnisse über Schleifen oder ähnliches, sondern gibt nur die Fakten ein und welches Ergebnis man benötigt. Prolog steht in der Abstraktionshierarchie aus genau diesem Grund über imperativen und objektorientierten Sprachen.
</p>
<div class="mw-heading mw-heading3"><h3 id="Bearbeitung_hierarchischer_Strukturen">Bearbeitung hierarchischer Strukturen</h3></div>
<p>Eine häufig gestellte Aufgabe an Programmiersprachen ist die Verarbeitung hierarchischer Strukturen, wie z.&nbsp;B. <a href="SGML" class="mw-redirect" title="SGML">SGML</a> oder <a href="Extensible_Markup_Language" title="Extensible Markup Language">XML</a>. Insbesondere für XML bildet Prolog eine sehr wirkungsvolle und ausdrucksstarke Alternative zu der verbreitetsten Verarbeitungssprache <a href="XSL_Transformation" title="XSL Transformation">XSLT</a>.
</p><p>Ein typischer XML-Baum wie
</p>
<div class="mw-highlight mw-highlight-lang-xml mw-content-ltr" dir="ltr"><pre><span></span><span class="nt">&lt;buch</span><span class="w"> </span><span class="na">titel=</span><span class="s">"Peer Gynt"</span><span class="nt">&gt;</span>
<span class="w"> </span><span class="nt">&lt;autor</span><span class="w"> </span><span class="na">name=</span><span class="s">"Henrik Ibsen"</span><span class="w"> </span><span class="na">nat=</span><span class="s">"norwegisch"</span><span class="nt">/&gt;</span>
<span class="w"> </span>...
<span class="nt">&lt;/buch&gt;</span>
</pre></div>
<p>wird unter Prolog als rekursive Liste von Elementen <i>element(TagName, Attribute, Kinder)</i> dargestellt.
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="p">[</span><span class="nf">element</span><span class="p">(</span><span class="s s-Atom">buch</span><span class="p">,</span> <span class="p">[</span><span class="s s-Atom">titel='Peer Gynt'</span><span class="p">],</span> <span class="p">[</span>
<span class="nf">element</span><span class="p">(</span><span class="s s-Atom">autor</span><span class="p">,</span> <span class="p">[</span><span class="s s-Atom">name='Henrik Ibsen'</span><span class="p">,</span> <span class="s s-Atom">nat='norwegisch'</span><span class="p">],</span> <span class="p">[]),</span>
<span class="p">...])</span>
<span class="p">]</span>
</pre></div>
<p>Ein sehr einfaches Paradigma (untere drei Klauseln) erlaubt es, jeden Baum rekursiv zu durchlaufen. Folgende Beispiele löschen (oberste Klausel mit <i>delete</i>) und konkatenieren (zweite Klausel von oben mit <i>concat</i>) bestimmte Tags. Der erste Unifikator ist die Operation (<i>delete</i> oder <i>concat</i>), der zweite die zu bearbeitende Struktur, der dritte das spezifizierte Tag, der vierte der Ergebnisbaum. <i>append</i> ist ein Befehl zum Konkatenieren von Listen.
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">transform</span><span class="p">(</span><span class="s s-Atom">delete</span><span class="p">,</span> <span class="p">[</span><span class="nf">element</span><span class="p">(</span><span class="nv">DelTag</span><span class="p">,</span> <span class="k">_</span><span class="p">,</span> <span class="k">_</span><span class="p">)</span> <span class="p">|</span> <span class="nv">Siblings</span><span class="p">],</span> <span class="nv">DelTag</span><span class="p">,</span> <span class="nv">ResTree</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">transform</span><span class="p">(</span><span class="s s-Atom">delete</span><span class="p">,</span> <span class="nv">Siblings</span><span class="p">,</span> <span class="nv">DelTag</span><span class="p">,</span> <span class="nv">ResTree</span><span class="p">).</span>

<span class="nf">transform</span><span class="p">(</span><span class="s s-Atom">concat</span><span class="p">,</span> <span class="p">[</span><span class="nv">Element1</span><span class="p">,</span> <span class="nv">Element2</span> <span class="p">|</span> <span class="nv">Siblings</span><span class="p">],</span> <span class="nv">ConTag</span><span class="p">,</span> <span class="nv">ResTree</span><span class="p">)</span> <span class="p">:-</span>
<span class="nv">Element1</span> <span class="o">=</span> <span class="nf">element</span><span class="p">(</span><span class="nv">Contag</span><span class="p">,</span> <span class="nv">Attr</span><span class="p">,</span> <span class="nv">Children1</span><span class="p">),</span>
<span class="nv">Element2</span> <span class="o">=</span> <span class="nf">element</span><span class="p">(</span><span class="nv">Contag</span><span class="p">,</span> <span class="k">_</span><span class="p">,</span> <span class="nv">Children2</span><span class="p">),</span>
<span class="nf">append</span><span class="p">(</span><span class="nv">Children1</span><span class="p">,</span> <span class="nv">Children2</span><span class="p">,</span> <span class="nv">Children</span><span class="p">),</span>
<span class="nf">transform</span><span class="p">(</span><span class="s s-Atom">concat</span><span class="p">,</span> <span class="p">[</span><span class="nf">element</span><span class="p">(</span><span class="nv">ConTag</span><span class="p">,</span> <span class="nv">Attr</span><span class="p">,</span> <span class="nv">Children</span><span class="p">)</span> <span class="p">|</span> <span class="nv">Siblings</span><span class="p">],</span> <span class="nv">ConTag</span><span class="p">,</span> <span class="nv">ResTree</span><span class="p">).</span>

<span class="nf">transform</span><span class="p">(</span><span class="k">_</span><span class="p">,</span> <span class="p">[],</span> <span class="k">_</span><span class="p">,</span> <span class="p">[]).</span>

<span class="nf">transform</span><span class="p">(</span><span class="nv">Trans</span><span class="p">,</span> <span class="p">[</span><span class="nf">element</span><span class="p">(</span><span class="nv">CTag</span><span class="p">,</span> <span class="nv">Attr</span><span class="p">,</span> <span class="nv">Children</span><span class="p">)</span> <span class="p">|</span> <span class="nv">Siblings</span><span class="p">],</span> <span class="nv">Tag</span><span class="p">,</span> <span class="nv">ResTree</span><span class="p">)</span> <span class="p">:-</span>
<span class="s s-Atom">\+</span> <span class="nv">Tag</span> <span class="o">=</span> <span class="nv">CTag</span><span class="p">,</span>
<span class="nf">transform</span><span class="p">(</span><span class="nv">Trans</span><span class="p">,</span> <span class="nv">Children</span><span class="p">,</span> <span class="nv">Tag</span><span class="p">,</span> <span class="nv">ResChildren</span><span class="p">),</span>
<span class="nf">transform</span><span class="p">(</span><span class="nv">Trans</span><span class="p">,</span> <span class="nv">Siblings</span><span class="p">,</span> <span class="nv">Tag</span><span class="p">,</span> <span class="nv">ResSiblings</span><span class="p">),</span>
<span class="nv">ResTree</span> <span class="o">=</span> <span class="p">[</span><span class="nf">element</span><span class="p">(</span><span class="nv">CTag</span><span class="p">,</span> <span class="nv">Attr</span><span class="p">,</span> <span class="nv">ResChildren</span><span class="p">)</span> <span class="p">|</span> <span class="nv">ResSiblings</span><span class="p">].</span>

<span class="nf">transform</span><span class="p">(</span><span class="k">_</span><span class="p">,</span> <span class="p">[</span><span class="nv">Atom</span><span class="p">],</span> <span class="k">_</span><span class="p">,</span> <span class="p">[</span><span class="nv">Atom</span><span class="p">])</span> <span class="p">:-</span>
<span class="nf">atomic</span><span class="p">(</span><span class="nv">Atom</span><span class="p">).</span>
</pre></div>
<p>Stößt der <a href="Backtracking" title="Backtracking">Backtracker</a> bei der Operation <i>delete</i> auf ein Tag, das wie das zu löschende heißt, so wird dieses entfernt und bei den Nachbarn weitergesucht. Ein entsprechender Aufruf ist z.&nbsp;B. <i>transform(delete, Tree, autor, ResTree).</i>, der alle Autoren entfernt.
</p><p>Ähnlich können durch <i>transform(concat, Tree, paragraph, ResTree).</i> alle nebeneinanderstehenden Paragraphen miteinander verschmolzen werden. Dazu werden zunächst deren Inhalte konkateniert, daraus eine neue Paragraphstruktur erzeugt und diese weiterverarbeitet.
</p>
<div class="mw-heading mw-heading3"><h3 id="Planungssysteme">Planungssysteme</h3></div>
<p>Planungssysteme suchen eine Möglichkeit, von einem Ausgangszustand in einen gewünschten Zielzustand zu gelangen. Sie lassen sich für die Suche von Straßen- oder Verkehrsverbindungen, aber auch für allgemeinere Problemstellungen einsetzen. Zunächst der allgemeinste Ansatz für eine <i>blinde <a href="Tiefensuche" title="Tiefensuche">Tiefensuche</a></i> (d.&nbsp;h., es ist unbekannt, ob der einzelne Schritt auch näher zum Ziel führt):
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">weg</span><span class="p">(</span><span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Zustandsliste</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">write</span><span class="p">(</span><span class="nv">Zustandsliste</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">.</span> <span class="c1">% Ziel erreicht, Abbruch der Rekursion und Ausgabe</span>

<span class="nf">weg</span><span class="p">(</span><span class="nv">Start</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Zustandsliste</span><span class="p">)</span> <span class="p">:-</span> <span class="c1">% Es gibt einen Weg vom Start zum Ziel, wenn ...</span>
<span class="nf">operator</span><span class="p">(</span><span class="nv">Op</span><span class="p">),</span> <span class="c1">% ... es einen Operator gibt, ...</span>
<span class="nf">anwendbar</span><span class="p">(</span><span class="nv">Op</span><span class="p">,</span> <span class="nv">Start</span><span class="p">),</span> <span class="c1">% ... der im Startzustand anwendbar ist, ...</span>
<span class="nf">fuehrt_zu</span><span class="p">(</span><span class="nv">Op</span><span class="p">,</span> <span class="nv">Start</span><span class="p">,</span> <span class="nv">Neu</span><span class="p">),</span> <span class="c1">% ... von dort zu einem neuen Zustand fuehrt, ...</span>
<span class="o">not</span><span class="p">(</span><span class="nf">member</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Zustandsliste</span><span class="p">)),</span> <span class="c1">% ... der noch nie da war (Verhinderung von Schleifen) ...</span>
<span class="nf">zulaessig</span><span class="p">(</span><span class="nv">Neu</span><span class="p">),</span> <span class="c1">% ... und zulaessig ist, ...</span>
<span class="nf">weg</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="p">[</span><span class="nv">Neu</span><span class="p">|</span><span class="nv">Zustandsliste</span><span class="p">]).</span> <span class="c1">% ... und es von dort einen Weg zum Ziel gibt.</span>
</pre></div>
<p>Nur die Prädikate <i>operator</i>, <i>anwendbar</i>, <i>fuehrt_zu</i> und <i>zulaessig</i> sowie die Beschreibung eines Zustands sind problemspezifisch zu formulieren. Aufgerufen wird das Prädikat mit einer Zustandsliste, die den Anfangszustand enthält.
</p><p>Abhängig vom Problemtyp lässt sich einiges vereinfachen und/oder weglassen; für eine Wegesuche in einem Straßennetz ergibt sich z.&nbsp;B.
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">weg</span><span class="p">(</span><span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">):-</span>
<span class="nf">write</span><span class="p">(</span><span class="nv">Ortsliste</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">.</span> <span class="c1">% Ziel erreicht, Abbruch der Rekursion und Ausgabe</span>

<span class="nf">weg</span><span class="p">(</span><span class="nv">Start</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">):-</span> <span class="c1">% Es gibt einen Weg vom Start zum Ziel, wenn ...</span>
<span class="nf">strasse</span><span class="p">(</span><span class="nv">Start</span><span class="p">,</span> <span class="nv">Neu</span><span class="p">),</span> <span class="c1">% ... es eine Strasse vom Start zu einem neuen Ort gibt, ...</span>
<span class="o">not</span><span class="p">(</span><span class="nf">member</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">)),</span> <span class="c1">% ... in dem man noch nicht war (Verhinderung von Schleifen), ...</span>
<span class="nf">weg</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="p">[</span><span class="nv">Neu</span><span class="p">|</span><span class="nv">Ortsliste</span><span class="p">]).</span> <span class="c1">% ... und von dem es einen Weg zum Ziel gibt.</span>
</pre></div>
<p>Bei realen Problemen führt eine blinde Suche selten zum Ziel; man benutzt eine Breitensuche, bei der alle vom Start aus erreichbaren neuen Zustände ermittelt, mit einer <i><a href="Heuristik" title="Heuristik">Heuristikfunktion</a></i> bewertet und nur der beste (<i>Heuristische Suche</i>) oder eine sortierte Liste der besten (<i>Best-first-Suche</i>) weiterverfolgt werden. (Die einfache heuristische Suche kann dazu führen, dass nicht immer die optimale Lösung gefunden wird, da bestimmte Lösungsschritte, die fälschlicherweise als ungünstig aussortiert wurden, in Wahrheit Teil einer besseren Lösung wären.) Die Kunst liegt in der richtigen problemspezifischen Formulierung der Heuristikfunktion. In vielen Fällen hilft die <i><a href="A*-Algorithmus" title="A*-Algorithmus">A*-Heuristik</a></i>, das ist die Summe aus bisher erbrachtem Aufwand und geschätztem Restaufwand zum Ziel (z.&nbsp;B. zurückgelegte Fahrtstrecke + Luftliniendistanz zum Zielort):
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">weg</span><span class="p">(</span><span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">,</span> <span class="nv">Strecke</span><span class="p">):-</span>
<span class="nf">write</span><span class="p">(</span><span class="nv">Ortsliste</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">,</span> <span class="nf">write</span><span class="p">(</span><span class="nv">Strecke</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">.</span> <span class="c1">% Ziel erreicht, Abbruch der Rekursion und Ausgabe</span>

<span class="nf">weg</span><span class="p">(</span><span class="nv">Start</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">,</span> <span class="nv">Strecke</span><span class="p">):-</span> <span class="c1">% Es gibt einen Weg vom Start zum Ziel, wenn...</span>
<span class="nf">findall</span><span class="p">(</span><span class="nv">Ort</span><span class="p">,</span> <span class="nf">strasse</span><span class="p">(</span><span class="nv">Start</span><span class="p">,</span> <span class="nv">Ort</span><span class="p">),</span> <span class="nv">Neuliste</span><span class="p">),</span> <span class="c1">% ...es eine Liste erreichbarer neuer Orte gibt,...</span>
<span class="nf">bewerte</span><span class="p">(</span><span class="nv">Neuliste</span><span class="p">,</span> <span class="nv">Start</span><span class="p">,</span> <span class="nv">Strecke</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="nv">BewerteteListe</span><span class="p">),</span> <span class="c1">% ...von denen jeder bewertet und ...</span>
<span class="nf">sort</span><span class="p">(</span><span class="nv">BewerteteListe</span><span class="p">,</span> <span class="nv">SortierteListe</span><span class="p">),</span> <span class="c1">% ...durch Sortieren der Liste...</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span> <span class="nv">Sgesamt</span><span class="p">,</span> <span class="nv">Neu</span><span class="p">],</span> <span class="nv">SortierteListe</span><span class="p">),</span> <span class="c1">% ...der beste gesucht wird,...</span>
<span class="o">not</span><span class="p">(</span><span class="nf">member</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Ortsliste</span><span class="p">)),</span> <span class="c1">% ...in dem man noch nicht war,...</span>
<span class="nf">weg</span><span class="p">(</span><span class="nv">Neu</span><span class="p">,</span> <span class="nv">Ziel</span><span class="p">,</span> <span class="p">[</span><span class="nv">Neu</span><span class="p">|</span><span class="nv">Ortsliste</span><span class="p">],</span> <span class="nv">Sgesamt</span><span class="p">).</span> <span class="c1">% ...und von dem es einen Weg zum Ziel gibt.</span>
</pre></div>
<p>Jedes Element von BewerteteListe hat die Struktur [Heuristikwert,gesamte Fahrtstrecke,Ort]; zur Berechnung der A-Heuristik sind die bisherige Strecke, der letzte Ort und der Zielort (Luftlinie) erforderlich.
</p>
<div class="mw-heading mw-heading3"><h3 id="Einsteins_Rätsel"><span id="Einsteins_R.C3.A4tsel"></span>Einsteins Rätsel</h3></div>
<p>Dies ist eine Version des <a href="Zebrar%C3%A4tsel" title="Zebrarätsel">Zebrarätsels</a>. Es wurde angeblich von <a href="Albert_Einstein" title="Albert Einstein">Albert Einstein</a> im 19. Jahrhundert verfasst. Einstein wird oft der Vermerk zugeschrieben, nur 2&nbsp;% der Weltbevölkerung seien im Stande, das Rätsel zu lösen. Es existiert jedoch kein Hinweis auf jedwede Autorenschaft. Hier soll es ein Beispiel für ein Problem darstellen, das mit Prolog lösbar ist.
</p>
<ol><li>Es gibt fünf Häuser mit je einer anderen Farbe.</li>
<li>In jedem Haus wohnt eine Person anderer Nationalität.</li>
<li>Jeder Hausbewohner bevorzugt ein bestimmtes Getränk, raucht eine bestimmte Zigarettenmarke und hält ein bestimmtes Haustier.</li>
<li>Keine der fünf Personen trinkt das gleiche Getränk, raucht die gleichen Zigaretten oder hält das gleiche Tier wie seine Nachbarn.</li></ol>
<p>Frage: Wem gehört der Fisch?
</p><p>Hinweise:
</p>
<ul><li>Der Brite lebt im roten Haus.</li>
<li>Der Schwede hält einen Hund.</li>
<li>Der Däne trinkt gern Tee.</li>
<li>Das grüne Haus steht direkt links neben dem weißen Haus.</li>
<li>Der Besitzer des grünen Hauses trinkt Kaffee.</li>
<li>Die Person, die Pall Mall raucht, hält einen Vogel.</li>
<li>Der Mann, der im mittleren Haus wohnt, trinkt Milch.</li>
<li>Der Besitzer des gelben Hauses raucht Dunhill.</li>
<li>Der Norweger wohnt im ersten Haus.</li>
<li>Der Marlboro-Raucher wohnt neben dem, der eine Katze hält.</li>
<li>Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht.</li>
<li>Der Winfield-Raucher trinkt gern Bier.</li>
<li>Der Norweger wohnt neben dem blauen Haus.</li>
<li>Der Deutsche raucht Rothmans.</li>
<li>Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt.</li></ul>
<p>Lösung:
</p><p>Jedes Haus ist eine Liste der Form [Farbe, Nationalität, Getränk, Zigarettenmarke, Haustier].
</p><p>Zuerst vier einfache Hilfsprädikate zur Listenbearbeitung:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">erstes</span><span class="p">(</span><span class="nv">E</span><span class="p">,</span> <span class="p">[</span><span class="nv">E</span><span class="p">|</span><span class="k">_</span><span class="p">]).</span>
<span class="nf">mittleres</span><span class="p">(</span><span class="nv">M</span><span class="p">,</span> <span class="p">[</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="nv">M</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">]).</span>

<span class="nf">links</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="p">[</span><span class="nv">A</span><span class="p">,</span><span class="nv">B</span><span class="p">|</span><span class="k">_</span><span class="p">]).</span>
<span class="nf">links</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="p">[</span><span class="k">_</span><span class="p">|</span><span class="nv">R</span><span class="p">])</span> <span class="p">:-</span> <span class="nf">links</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">R</span><span class="p">).</span>

<span class="nf">neben</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">L</span><span class="p">)</span> <span class="p">:-</span>
<span class="nf">links</span><span class="p">(</span><span class="nv">A</span><span class="p">,</span> <span class="nv">B</span><span class="p">,</span> <span class="nv">L</span><span class="p">);</span>
<span class="nf">links</span><span class="p">(</span><span class="nv">B</span><span class="p">,</span> <span class="nv">A</span><span class="p">,</span> <span class="nv">L</span><span class="p">).</span>
</pre></div>
<p>Lösungsprädikat:
</p>
<div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">run</span> <span class="o">:-</span>
<span class="nv">X</span> <span class="o">=</span> <span class="p">[</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="c1">% Es gibt (nebeneinander) 5 (noch unbekannte) Häuser</span>
<span class="nf">member</span><span class="p">([</span><span class="s s-Atom">rot</span><span class="p">,</span><span class="s s-Atom">brite</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Brite lebt im roten Haus</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">schwede</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">hund</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Schwede hält einen Hund</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">daene</span><span class="p">,</span><span class="s s-Atom">tee</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Däne trinkt gern Tee</span>
<span class="nf">links</span><span class="p">([</span><span class="s s-Atom">gruen</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="p">[</span><span class="s s-Atom">weiss</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Das grüne Haus steht links vom weißen Haus</span>
<span class="nf">member</span><span class="p">([</span><span class="s s-Atom">gruen</span><span class="p">,</span> <span class="k">_</span><span class="p">,</span> <span class="s s-Atom">kaffee</span><span class="p">,</span> <span class="k">_</span><span class="p">,</span> <span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Besitzer des grünen Hauses trinkt Kaffee</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">pallmall</span><span class="p">,</span><span class="s s-Atom">vogel</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Die Person, die Pall Mall raucht, hält einen Vogel</span>
<span class="nf">mittleres</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">milch</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Mann, der im mittleren Haus wohnt, trinkt Milch</span>
<span class="nf">member</span><span class="p">([</span><span class="s s-Atom">gelb</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">dunhill</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Besitzer des gelben Hauses raucht Dunhill</span>
<span class="nf">erstes</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">norweger</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Norweger wohnt im 1. Haus</span>
<span class="nf">neben</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">marlboro</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="p">[</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">katze</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Marlboro-Raucher wohnt neben dem, der eine Katze hält</span>
<span class="nf">neben</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">pferd</span><span class="p">],</span> <span class="p">[</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">dunhill</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">bier</span><span class="p">,</span><span class="s s-Atom">winfield</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Winfield-Raucher trinkt gern Bier</span>
<span class="nf">neben</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">norweger</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="p">[</span><span class="s s-Atom">blau</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Norweger wohnt neben dem blauen Haus</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">deutsche</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">rothmans</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Deutsche raucht Rothmans</span>
<span class="nf">neben</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">marlboro</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="p">[</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">wasser</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt</span>
<span class="nf">member</span><span class="p">([</span><span class="k">_</span><span class="p">,</span><span class="nv">N</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="k">_</span><span class="p">,</span><span class="s s-Atom">fisch</span><span class="p">],</span> <span class="nv">X</span><span class="p">),</span> <span class="c1">% Der mit der Nationalität N hat einen Fisch</span>
<span class="nf">write</span><span class="p">(</span><span class="nv">X</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">,</span> <span class="c1">% Ausgabe aller Häuser</span>
<span class="nf">write</span><span class="p">(</span><span class="s s-Atom">'Der '</span><span class="p">),</span> <span class="nf">write</span><span class="p">(</span><span class="nv">N</span><span class="p">),</span>
<span class="nf">write</span><span class="p">(</span><span class="s s-Atom">' hat einen Fisch als Haustier.'</span><span class="p">),</span> <span class="s s-Atom">nl</span><span class="p">.</span> <span class="c1">% Antwort auf die Frage</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Definite_Clause_Grammar">Definite Clause Grammar</h2></div>
<p>Um Regeln für <a href="Parser" title="Parser">Parser</a> zu schreiben, haben die meisten Prologsysteme einen <a href="Pr%C3%A4prozessor" title="Präprozessor">Präprozessor</a> implementiert. Er erlaubt es, die Regeln in einer besser lesbaren Form zu notieren, die in der Form den Regeln entsprechen, die verwendet wird, um eine <a href="Kontextfreie_Sprache" title="Kontextfreie Sprache">kontextfreie Sprache</a> zu beschreiben. Der Präprozessor ergänzt Platzhalter und erzeugt die oben erwähnten Prolog-Logik-Formeln. Durch Übergabe weiterer Attribute ist es möglich, mit Definite Clause Grammars auch komplexere Sprachen als die kontextfreien zu beschreiben.
</p>
<div class="mw-heading mw-heading2"><h2 id="Prolog_aus_logischer_Sicht">Prolog aus logischer Sicht</h2></div>
<p>Ein Prolog-Programm ist eine geordnete Liste so genannter <a href="Horn-Formel" title="Horn-Formel">Horn-Klauseln</a>, einer eingeschränkten Form der <a href="Pr%C3%A4dikatenlogik" title="Prädikatenlogik">Prädikatenlogik</a> erster Ordnung. Stellt man dem System eine Anfrage (<i>Query</i>), versucht es, diese auf der Grundlage dieser <a href="Datenbasis" title="Datenbasis">Datenbasis</a> mittels <a href="Resolution_(Logik)" title="Resolution (Logik)">Resolution</a> zu beweisen. Das Ergebnis einer Query ist <i>yes</i> oder <i>no</i>. Seine eigentliche <a href="Wirkung_(Informatik)" title="Wirkung (Informatik)">Wirkung</a> entfaltet ein Prolog-Programm streng genommen durch Nebenwirkungen, die während der Beweissuche auftreten. Also kann ein Prolog-System auch als ein sehr effizienter – wenn auch eingeschränkter – automatischer <a href="Maschinengest%C3%BCtztes_Beweisen" title="Maschinengestütztes Beweisen">Theorembeweiser</a> verstanden werden. Die einzige in Prolog eingebaute Suchstrategie bei der Beweisfindung ist <a href="Tiefensuche" title="Tiefensuche">Tiefensuche</a> mit <a href="Backtracking" title="Backtracking">Backtracking</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Anwendungsgebiete">Anwendungsgebiete</h2></div>
<p>In den 1980er Jahren spielte die Sprache eine wichtige Rolle beim Bau von <a href="Expertensystem" title="Expertensystem">Expertensystemen</a>.
Die Sprache wird heute noch in den Bereichen <a href="Computerlinguistik" title="Computerlinguistik">Computerlinguistik</a> und <a href="K%C3%BCnstliche_Intelligenz" title="Künstliche Intelligenz">Künstliche Intelligenz</a> verwendet. Zum Beispiel sind Sprachverarbeitungskomponenten des durch seinen Auftritt bei <a href="Jeopardy!" title="Jeopardy!">Jeopardy!</a> bekannt gewordenen KI-Systems <a href="Watson_(K%C3%BCnstliche_Intelligenz)" title="Watson (Künstliche Intelligenz)">Watson</a> in Prolog geschrieben.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> Außerdem gibt es einige kommerzielle Anwendungen im Bereich des Systemmanagements, bei denen asynchrone Ereignisse (Events) mit Hilfe von Prolog oder darauf basierenden proprietären Erweiterungen verarbeitet werden. Ein Beispiel hierzu ist das Produkt <i><a href="Tivoli_(IBM)" title="Tivoli (IBM)">Tivoli</a> Enterprise Console</i> (TEC) von <a href="IBM" title="IBM">IBM</a>, das auf IBM-Prolog basiert. Der 1986 in Japan von <a href="Sega" title="Sega">Sega</a> veröffentlichte <a href="Sega_AI_Computer" title="Sega AI Computer">Sega AI Computer</a> benutzte Prolog als ins <a href="Read-only-Memory" class="mw-redirect" title="Read-only-Memory">ROM</a> integrierte und somit sofort nach dem Anschalten des Computers nutzbare Programmiersprache.
</p>
<div class="mw-heading mw-heading2"><h2 id="Siehe_auch">Siehe auch</h2></div>
<ul><li><a href="Liste_von_Programmiersprachen" title="Liste von Programmiersprachen">Liste von Programmiersprachen</a></li>
<li><a href="Zeittafel_der_Programmiersprachen" title="Zeittafel der Programmiersprachen">Zeittafel der Programmiersprachen</a></li>
<li><a href="Axiom" title="Axiom">Axiom</a>, <a href="Deduktion" title="Deduktion">Deduktion</a></li>
<li><a href="Schnittregel" title="Schnittregel">Schnittregel</a></li>
<li><a href="Erlang_(Programmiersprache)" title="Erlang (Programmiersprache)">Erlang</a> (begann als Prolog-Interpreter, auch die <a href="Syntax" title="Syntax">Syntax</a> ist davon inspiriert, ebenfalls personelle Nähe, denn der Erfinder von Erlang <a href="Joe_Armstrong_(Informatiker)" title="Joe Armstrong (Informatiker)">Joe Armstrong</a> hat am Swedish Institute of Computer Science (SICS) gearbeitet)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Rüdeger Baumann: <i>Prolog Einführungskurs</i>. Klett Verlag, 1991, ISBN 3-12-717721-6.</li>
<li>Patrick Blackburn, Johan Bos, Kristina Striegnitz: <i>Learn Prolog Now!</i> College Publications, 2006, ISBN 1-904987-17-6.</li>
<li>David L. Bowen, Lawrence Byrd, Fernando C. N. Pereira, Luís M. Pereira, David H. D. Warren: <i>DECsystem-10 Prolog User’s Manual.</i> Occasional Paper 27, 1982. University of Edinburgh, Department of Artificial Intelligence; <a rel="nofollow" class="external text" href="http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/prolog/doc/intro/prolog.doc">cs.cmu.edu</a> (<a href="Microsoft_Word" title="Microsoft Word">MS Word</a>; 192&nbsp;kB)</li>
<li>Hans Kleine Büning, Stefan Schmittgen: <i>PROLOG: Grundlagen und Anwendungen</i>. B.G. Teubner, Stuttgart 1986, ISBN 3-519-02484-5.</li>
<li>Ivan Bratko: <i>Prolog Programming for Artificial Intelligence</i>. 4. Auflage. Addison-Wesley, Harlow 2012, ISBN 0-321-41746-1.</li>
<li>William F. Clocksin: <i>Clause and Effect. Prolog Programming for the Working Programmer</i>. Springer, Berlin 2005, ISBN 3-540-62971-8.</li>
<li>William F. Clocksin, Christopher S. Mellish: <i>Programming in Prolog</i>. 5. Auflage. Springer, Berlin 2003, ISBN 3-540-00678-8.</li>
<li>Michael A. Covington, Donald Nute, André Vellino: <i>Prolog Programming in Depth</i>. Prentice Hall, 1996, ISBN 0-13-138645-X.</li>
<li>H. Göhner, B. Hafenbrak: <i>Arbeitsbuch PROLOG</i>. Dümmler, Bonn 1995, ISBN 3-427-46863-1.</li>
<li>Richard A. O’Keefe: <i>The Craft of Prolog</i>. MIT Press, Cambridge 1990, ISBN 0-262-15039-5.</li>
<li>Esther König, Roland Seiffert: <i>Grundkurs PROLOG fur Linguisten</i>. UTB Linguistik, 1989, ISBN 3-7720-1749-5.</li>
<li>Leon S. Sterling, Ehud Shapiro: <i>The Art of Prolog. Advanced Programming Techniques</i>. 2. Auflage. MIT Press, Cambridge 1994, ISBN 0-262-69163-9.</li>
<li>Leon S. Sterling: <i>The Practice of Prolog</i>. MIT Press, Cambridge 2003, ISBN 0-262-51445-1.</li>
<li>Gerhard Röhner: <i>Informatik mit Prolog</i>. Amt für Lehrerbildung (AfL), 2007; <a rel="nofollow" class="external text" href="https://arbeitsplattform.bildung.hessen.de/fach/informatik/informatikmitprolog.pdf">bildung.hessen.de</a> (PDF; 4,3&nbsp;MB).</li>
<li>Wilhelm Weisweber: <i>Prolog. Logische Programmierung in der Praxis</i>. Thomson, 1997, ISBN 3-8266-0174-2.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Tutorials_und_Kurse">Tutorials und Kurse</h3></div>
<div class="sisterproject" style="margin:0.1em 0 0 0;"><div class="noviewer" style="display:inline-block; line-height:10px; min-width:1.6em; text-align:center;" aria-hidden="true" role="presentation"><span class="mw-default-size" typeof="mw:File"><span title="Wikibooks"></span></span></div><b><a href="https://de.wikibooks.org/wiki/Prolog" class="extiw external" title="b:Prolog">Wikibooks: Prolog</a></b>&nbsp;– Lern- und Lehrmaterialien</div>
<ul><li><a rel="nofollow" class="external text" href="http://www.learnprolognow.org/">Learn Prolog Now!</a> Online-Buch mit Prolog-Einführung, auch für Programmieranfänger verständlich geschrieben. (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.philipphauer.de/info/info/datenbanken-in-prolog/">Datenbanken in Prolog. Umsetzung von SQL-Abfragen in Prolog.</a></li>
<li><a rel="nofollow" class="external text" href="http://cs.union.edu/~striegnk/courses/nlp-with-prolog/html/">Natural Language Processing Techniques in Prolog</a> (englisch)</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Prolog-Implementierungen">Prolog-Implementierungen</h3></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.picat-lang.org/bprolog/">BProlog</a> kommerzielles Prolog-System (kostenlos für Bildung und Forschung) mit Erweiterungen zur Constraintprogrammierung (CLP), <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">Nebenläufigkeit</a> und interaktive Graphen</li>
<li><a rel="nofollow" class="external text" href="http://www.gprolog.org/">GNU Prolog</a> Der freie, quelloffene <a href="GNU" title="GNU">GNU</a> Prolog Compiler (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.jiprolog.com/">JIProlog</a> ist ein als Shareware erhältlicher kommerzieller Prolog-Interpreter, der ISO-Kompatibilität anstrebt und in <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> (<a href="Java_Platform%2C_Standard_Edition" title="Java Platform, Standard Edition">J2SE</a>, <a href="Java_Platform%2C_Micro_Edition" title="Java Platform, Micro Edition">J2ME</a>) läuft</li>
<li><a rel="nofollow" class="external text" href="https://prolog.codeplex.com/">Prolog.NET</a> Prolog-Entwicklungsumgebung für das <a href=".Net-Framework" title=".Net-Framework">.Net-Framework</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.sics.se/isl/sicstuswww/site/index.html">SICStus Prolog</a> kommerzielles, ISO-kompatibles Prolog-System vom Swedish Institute of Computer Science, erlaubt z.&nbsp;B. <a href="Constraintprogrammierung" title="Constraintprogrammierung">Constraintprogrammierung</a> (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.swi-prolog.org/">SWI-Prolog</a> freies, quelloffenes (<a href="GNU_Lesser_General_Public_License" title="GNU Lesser General Public License">LGPL</a>), umfassendes ISO-kompatibles Prolog-System mit gutem <a href="Online-Community" title="Online-Community">Community</a>-Support (inkl. <a href="Editor_(Software)" title="Editor (Software)">Editor</a>, <a href="Debugger" title="Debugger">Debugger</a>, <a href="Profiler_(Programmierung)" title="Profiler (Programmierung)">Profiler</a> und zahlreichen <a href="Programmbibliothek" title="Programmbibliothek">Programmbibliotheken</a>; englisch)</li>
<li><a rel="nofollow" class="external text" href="http://apice.unibo.it/xwiki/bin/view/Tuprolog/">tuProlog</a> ist ein freier, quelloffener (LGPL) Interpreter für eine Untermenge von Prolog in <a href="Java_(Programmiersprache)" title="Java (Programmiersprache)">Java</a> (<a href="Java_Platform%2C_Standard_Edition" title="Java Platform, Standard Edition">J2SE</a>, <a href="Java_Platform%2C_Micro_Edition" title="Java Platform, Micro Edition">J2ME</a>) und .NET</li>
<li><a rel="nofollow" class="external text" href="http://www.dcc.fc.up.pt/~vsc/Yap/">YAP Prolog</a> freier, quelloffener, schneller, ISO-kompatibler Prolog-Interpreter</li>
<li><a rel="nofollow" class="external text" href="http://sourceforge.net/projects/cs-prolog/">C# Prolog</a>, freier, quelloffener Prolog-Interpreter</li></ul>
<div class="mw-heading mw-heading3"><h3 id="An_Prolog_orientierte_logische_Programmiersysteme">An Prolog orientierte logische Programmiersysteme</h3></div>
<ul><li><a rel="nofollow" class="external text" href="http://ciao-lang.org/">Ciao</a> frei, quelloffen (LGPL), implementiert ISO Prolog, hat Spracherweiterungen für variable Prädikate (HiLog), <a href="Constraintprogrammierung" title="Constraintprogrammierung">constraintbasierte</a>, <a href="Objektorientierte_Programmierung" title="Objektorientierte Programmierung">objektorientierte</a> und <a href="Nebenl%C3%A4ufigkeit" title="Nebenläufigkeit">nebenläufige</a> Programmierung (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.eclipseclp.org/">ECLiPSe Constraint Programming System</a> frei, quelloffen (<a href="Mozilla_Public_License" title="Mozilla Public License">MPL</a>), Prolog-basiert mit Erweiterungen für Constraintprogrammierung und zusätzliche Suchstrategien (englisch)</li>
<li><a rel="nofollow" class="external text" href="https://logtalk.org/">Logtalk</a> ist eine freie, quelloffene (<a href="Artistic_License" title="Artistic License">Artistic License</a> 2.0) objektorientierte logische Programmiersprache (englisch)</li>
<li><a href="Mercury_(Programmiersprache)" title="Mercury (Programmiersprache)">Mercury</a>, eine stark an Prolog angelehnte Programmiersprache, vereint Elemente aus der <a href="Funktionale_Programmierung" title="Funktionale Programmierung">funktionalen</a> und der logischen Programmierung (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://www.cs.bham.ac.uk/research/projects/poplog/freepoplog.html">Poplog</a> ist eine freie, quelloffene (<a href="XFree86" title="XFree86">XFree86</a>-Lizenz), integrierte, interaktive Programmierumgebung mit inkrementellen <a href="Compiler" title="Compiler">Compilern</a> für die Sprachen POP-11, Prolog, <a href="Common_Lisp" title="Common Lisp">Common Lisp</a> und <a href="Standard_ML" title="Standard ML">Standard ML</a>, die nicht nur multiparadigmatisches Programmieren, sondern auch das Mischen dieser Programmiersprachen ermöglicht (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://itee.uq.edu.au/~pjr/HomePages/QuPrologHome.html">QuProlog</a> – ein erweiterter, freier Prolog-Compiler, der v.&nbsp;a. zum Implementieren interaktiver Theorembeweiser dient (englisch)</li>
<li><a rel="nofollow" class="external text" href="http://xsb.sourceforge.net/">XSB</a> freies, quelloffenes (LGPL), »fast«&nbsp;ISO-Prolog-kompatibles logisches Programmiersystem mit über Prolog hinausgehenden Spracherweiterungen (HiLog; volle, <a href="Memoisation" title="Memoisation">tabulierte</a> <a href="Resolution_(Logik)" title="Resolution (Logik)">Resolution</a>; erweitertes <a href="Pattern_Matching" title="Pattern Matching">Pattern Matching</a>) und Bibliotheken für <a href="Grafische_Benutzeroberfl%C3%A4che" title="Grafische Benutzeroberfläche">GUI</a>-Programmierung, <a href="F-Logic" title="F-Logic">F-Logic</a> und <a href="Ontologie_(Informatik)" title="Ontologie (Informatik)">Ontologie</a>-Verarbeitung (englisch)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise_und_Anmerkungen">Einzelnachweise und Anmerkungen</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text">A. Colmerauer und P. Roussel: <a rel="nofollow" class="external text" href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.7438&amp;rep=rep1&amp;type=pdf"><i>The birth of prolog. History of programming languages II</i>.</a> (PDF; 2,1&nbsp;MB) ist.psu.edu, 1996, S. 331–367.</span>
</li>
<li id="cite_note-c+m-2"><span class="mw-cite-backlink"><a href="#cite_ref-c+m_2-0">↑</a></span> <span class="reference-text">In Ermangelung einer formalen Spezifikation für <i>Edinburgh Prolog</i> wurde meist das <i>DEC-10 PROLOG Manual</i> von Bowen u.&nbsp;a. (1982) oder <i>Programming in Prolog</i> von Clocksin und Mellish herangezogen.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><span class="cite">Adam Lally, Paul Fodor: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20140903064037/http://www.cs.nmsu.edu/ALP/2011/03/natural-language-processing-with-prolog-in-the-ibm-watson-system/"><i>Natural Language Processing With Prolog in the IBM Watson System.</i></a> The Association for Logic Programming, 31.&nbsp;März 2011, archiviert vom <style data-mw-deduplicate="TemplateStyles:r250917974">
/* start https://de.wikipedia.org/ */


.mw-parser-output .dewiki-iconexternal>a{background-position:center right!important;background-repeat:no-repeat!important}body.skin-minerva .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/OOjs_UI_icon_external-link-ltr-progressive.svg")!important;background-size:10px!important;padding-right:13px!important}body.skin-timeless .mw-parser-output .dewiki-iconexternal>a,body.skin-monobook .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/MediaWiki_external_link_icon.svg")!important;padding-right:13px!important}body.skin-vector .mw-parser-output .dewiki-iconexternal>a{background-image:url("./_mw_/Link.ernal-small-ltr-progressive.svg")!important;background-size:0.857em!important;padding-right:1em!important}


/* end https://de.wikipedia.org/ */
</style><span class="dewiki-iconexternal"><a class="external text" href="https://redirecter.toolforge.org/?url=http%3A%2F%2Fwww.cs.nmsu.edu%2FALP%2F2011%2F03%2Fnatural-language-processing-with-prolog-in-the-ibm-watson-system%2F">Original</a></span> (nicht mehr online verfügbar) am <span style="white-space:nowrap;">3.&nbsp;September 2014</span><span>;</span><span class="Abrufdatum"> abgerufen am 18.&nbsp;Oktober 2001</span> (englisch).</span> <small class="archiv-bot"><span class="wp_boppel noviewer" aria-hidden="true" role="presentation"><span typeof="mw:File"><span title="i"></span></span></span>&nbsp;<b>Info:</b> Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.</small><span style="display:none"><a rel="nofollow" class="external text" href="http://IABotmemento.invalid/http://www.cs.nmsu.edu/ALP/2011/03/natural-language-processing-with-prolog-in-the-ibm-watson-system/">@1</a></span><span style="display:none"><a rel="nofollow" class="external text" href="http://www.cs.nmsu.edu/ALP/2011/03/natural-language-processing-with-prolog-in-the-ibm-watson-system/">@2</a></span><span style="display:none">Vorlage:Webachiv/IABot/www.cs.nmsu.edu</span><span style="display: none;" class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&amp;rfr_id=info%3Asid%2Fde.wikipedia.org%3AProlog+%28Programmiersprache%29&amp;rft.title=Natural+Language+Processing+With+Prolog+in+the+IBM+Watson+System&amp;rft.description=Natural+Language+Processing+With+Prolog+in+the+IBM+Watson+System&amp;rft.identifier=https%3A%2F%2Fweb.archive.org%2Fweb%2F20140903064037%2Fhttp%3A%2F%2Fwww.cs.nmsu.edu%2FALP%2F2011%2F03%2Fnatural-language-processing-with-prolog-in-the-ibm-watson-system%2F&amp;rft.creator=Adam+Lally%2C+Paul+Fodor&amp;rft.publisher=The+Association+for+Logic+Programming&amp;rft.date=2011-03-31&amp;rft.source=http://www.cs.nmsu.edu/ALP/2011/03/natural-language-processing-with-prolog-in-the-ibm-watson-system/&amp;rft.language=en">&nbsp;</span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2025-07-31" href="https://de.wikipedia.org/wiki/?title=Prolog_(Programmiersprache)&amp;oldid=258454365">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>